<?php

namespace app\admin\service;

use app\admin\lib\exception\BaseException;
use app\admin\model\Admin as AdminModel;
use app\admin\model\Common as CommonModel;

class AdminService
{
    /**
     * 获取管理员列表
     */
    public function getAdminList(int $page, int $limit)
    {
        $result = AdminModel::getList($page, $limit);
        
        return [
            'list' => $result->items(),
            'total' => $result->total(),
            'current_page_count' => $result->count(),
        ];
    }

    /**
     * 添加管理员
     */
    public function addAdmin(array $data)
    {
        // 调用模型添加数据
        $admin = CommonModel::create($data);

        // 隐藏敏感字段并返回
        return $admin->hidden(['password'])->toArray();
    }

    /**
     * 删除管理员
     */
    public function deleteAdmin(int $id, int $operatorRole)
    {
        // 1. 查目标管理员是否存在
        $targetAdmin = AdminModel::findById($id);
        if (!$targetAdmin) {
            throw new BaseException([
                'code' => 404,
                'message' => '管理员不存在或已删除',
                'errorCode' => 60001
            ]);
        }

        // 2. 禁止删除超级管理员（role=1）
        if ($targetAdmin->role == 1) {
            throw new BaseException([
                'code' => 403,
                'message' => '禁止删除超级管理员',
                'errorCode' => 60008
            ]);
        }

        // 3. 仅超级管理员（role=1）有权删除
        if ($operatorRole != 1) {
            throw new BaseException([
                'code' => 403,
                'message' => '仅超级管理员可删除管理员',
                'errorCode' => 60009
            ]);
        }

        // 4. 执行删除，失败抛异常
        $result = $targetAdmin->deleteAdmin();
        if (!$result) {
            throw new BaseException([
                'code' => 500,
                'message' => '删除失败，请重试',
                'errorCode' => 60002
            ]);
        }

        return true;
    }

    /**
     * 编辑管理员
     */
    public function editAdmin(array $data, int $operatorRole)
    {
        // 1. 查目标管理员是否存在
        $targetAdmin = AdminModel::findById($data['id']);
        if (!$targetAdmin) {
            throw new BaseException([
                'code' => 404,
                'message' => '管理员不存在或已删除',
                'errorCode' => 60001
            ]);
        }

        // 2. 禁止修改超级管理员（role=1），但允许修改头像
        if ($targetAdmin->role == 1 && !isset($data['avatar'])) {
            throw new BaseException([
                'code' => 403,
                'message' => '禁止修改超级管理员信息',
                'errorCode' => 60010
            ]);
        }

        // 3. 仅超级管理员可改角色/状态，非超级管理员禁止
        $isSuper = $operatorRole == 1;
        if (!$isSuper && (isset($data['role']) || isset($data['status']))) {
            throw new BaseException([
                'code' => 403,
                'message' => '仅超级管理员可修改角色/状态',
                'errorCode' => 60011
            ]);
        }

        // 4. 用户名修改：排除自身查唯一性
        if (isset($data['username']) && $data['username'] != $targetAdmin->username) {
            $exists = AdminModel::checkUsernameExists($data['username'], $data['id']);
            if ($exists) {
                throw new BaseException([
                    'code' => 400,
                    'message' => '用户名已被占用',
                    'errorCode' => 60003
                ]);
            }
        }

        // 5. 执行更新，失败抛异常
        $result = $targetAdmin->updateAdminInfo($data);
        if (!$result) {
            throw new BaseException([
                'code' => 500,
                'message' => '更新失败，请重试',
                'errorCode' => 60006
            ]);
        }

        // 隐藏敏感字段并返回
        return $targetAdmin->hidden(['password'])->toArray();
    }
}
